package Thread;/*
 *
 *@author:    Xavier
 *@data:      2024 - 01 - 11
 *@time:      15:35
 *
 */

// 线程终止，自己定义一个表示位
public class Demo08 {
    // 写作成员变量就不是触发变量捕获了，而是“内部类访问外部类的成员”
    public static boolean isQuit = false;

    // lambda为了解决局部变量问题，而引入的一个“变量捕获”
    // 看似是在内部直接访问外部变量，其实本质上是把外部变量给复制了一份，到lambda里面，从而解决了生命周期问题
    //在JS中采取了更加激进的设计，也有变量捕获，不通过复制的方式，而是直接改变外部变量的生命周期
    //从而保证lambda在执行的时候肯定可以访问到外部的变量
    public static void main(String[] args) throws InterruptedException {
        // boolean isQuit = false       //写在这里报错
        // 这里是跟随main方法的执行而启动，而lambda表达式执行时机较为后面
        // 这就导致，后面执行lambda的时候，局部变量isQuit可能已经被销毁了
        // 解决方案：可以加一个final，变成一个不可变的量
        Thread t = new Thread(()->{
           while (!isQuit) {
               System.out.println("hello thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
           }
        });
        t.start();

        //主线程这里执行一些其他逻辑之后，要让t线程结束
        Thread.sleep(3000);

        //这个代码就是在修改前面设定的标志位
        isQuit = true;
        System.out.println("把t线程终止");
    }
}
